package com.kerrykidz.sales.service;

import java.util.List;

import com.kerrykidz.sales.dao.model.OrderRecord;
import com.kerrykidz.sales.dao.model.PosOrderEntity;
import com.kerrykidz.sales.dao.model.PosOrderPaymentEntity;
import com.kerrykidz.sales.dao.model.PosOrderPrdEntity;
import com.kerrykidz.system.util.printReceipt.PrinterMessage;

/**
 * 
 * @Description 订单接口
 * @author QUINN
 * @date 2014年9月1日下午8:32:01
 */
public interface IOrderService {

	/**
	 * 
	 * @Description 根据主键查询订单 购物车等
	 * @param pkId
	 * @return
	 * @author QUINN
	 * @date 2014年8月6日上午10:51:05
	 */
	PosOrderEntity findOrderByPk(String pkId);

	/**
	 * 
	 * @Description 创建未付款订单、购物车
	 * @param order
	 *            订单信息 （PK，OPERATE_TIME这些字段我会在后面执行时set value）
	 * @param products
	 *            创建订单对应的商品信息
	 * @return 订单主键
	 * @author QUINN
	 * @throws Exception
	 *             开发人员捕获该异常获取异常信息
	 * @date 2014年8月6日下午2:40:03
	 */

	String createNotPayOfOrder(PosOrderEntity order, List<PosOrderPrdEntity> products, String storeName)
			throws Exception;

	/**
	 * 
	 * @Description 购单次票、购单次票并充值
	 * @param order
	 *            订单信息
	 * @param ticket
	 *            1+1票
	 * @param adult
	 *            成人票
	 * @param recharge
	 *            充值信息 如果没有充值操作该参数为null
	 * @return 订单主键
	 * @author QUINN
	 * @date 2014年8月6日下午5:41:21
	 */
	String createTicket(PosOrderEntity order, List<PosOrderPrdEntity> tickets, PosOrderPrdEntity recharge,
			String storeName)
			throws Exception;

	/**
	 * 
	 * @Description 创建含有支付的订单
	 * @param order
	 *            订单信息
	 * @param products
	 *            商品信息
	 * @param payment
	 *            付款信息
	 * @return 订单主键
	 * @author QUINN
	 * @date 2014年8月6日下午6:25:49
	 */
	String createHavePayOfOrder(PosOrderEntity order, List<PosOrderPrdEntity> products, PosOrderPaymentEntity payment,
			String storeName) throws Exception;

	/**
	 * 
	 * @Description 根据条件分页查询
	 * @param order
	 * @return
	 * @author QUINN
	 * @date 2014年8月8日下午1:59:04
	 */
	PosOrderEntity paginate(PosOrderEntity order);

	/**
	 * 
	 * @Description 查询订单购买的商品信息
	 * @param orderId
	 * @return
	 * @author QUINN
	 * @date 2014年8月8日下午7:51:30
	 */
	List<PosOrderPrdEntity> findOrderPrdByOrderId(String orderId);

	/**
	 * 
	 * @Description 完成支付时更改订单状态，将该方法置于支付事务中
	 * @param orderId
	 *            订单号
	 * @throws Exception
	 * @author QUINN
	 * @date 2014年8月11日下午5:06:51
	 */
	void finishPayment(String orderId) throws Exception;

	/**
	 * 注意：这里会先删除商品 再重新添加商品
	 * 
	 * @Description 修改订单
	 * @param order
	 * @author QUINN
	 * @date 2014年8月15日下午6:20:51
	 */
	void updateOrder(PosOrderEntity order, List<PosOrderPrdEntity> products) throws Exception;

	/**
	 * 
	 * @Description 更新订单的商品
	 * @param prd
	 * @author QUINN
	 * @date 2014年8月21日下午3:19:17
	 */
	void updateOrderProduct(PosOrderPrdEntity prd) throws Exception;

	/**
	 * 
	 * @Description 根据属性条件查询订单
	 * @param order
	 * @return
	 * @author QUINN
	 * @date 2014年8月21日下午5:35:42
	 */
	PosOrderEntity findByCondition(PosOrderEntity order);

	/**
	 * 
	 * @Description 根据属性条件查询订单商品
	 * @param prd
	 * @return
	 * @author QUINN
	 * @date 2014年8月22日上午10:11:42
	 */
	PosOrderPrdEntity findOrderPrdByCondition(PosOrderPrdEntity prd);

	/**
	 * 
	 * @Description 创建商品明细
	 * @param prd
	 * @author QUINN
	 * @date 2014年8月22日上午11:57:08
	 */
	void createOrderPrd(List<PosOrderPrdEntity> prds) throws Exception;

	/**
	 * 
	 * @Description 创建购物车(仅仅是创建购物车，不包购物车商品明细)
	 * @param order
	 * @throws Exception
	 * @author QUINN
	 * @date 2014年8月23日下午2:24:58
	 */
	void createShopcart(PosOrderEntity order) throws Exception;

	/**
	 * 
	 * @Description 获取当前用户创建购物车
	 * @param userId
	 * @param abbrCode
	 * @return
	 * @author QUINN
	 * @date 2014年8月23日下午9:06:06
	 */
	PosOrderEntity createAndfindCurrentShopCart(String userId, String abbrCode, String branId);

	/**
	 * 修改订单
	 * 
	 * @Description void
	 * @author chenyu 2014年8月25日 下午6:03:58
	 */
	void updateOrder(PosOrderEntity orderOld);

	/**
	 * 根据订单id，删除订单商品详细。
	 * 
	 * @Description void
	 * @author chenyu 2014年8月25日 下午6:03:46
	 */
	void removeOrderPrdByOrderId(String orderId);

	/**
	 * 
	 * @Description 根据订单号和商品id删除商品明细
	 * @param orderId
	 * @param prdId
	 * @author QUINN
	 * @date 2014年8月27日上午10:01:56
	 */
	void removeOrderPrdByOrderIdAndProductId(String orderId, String prdId);

	/**
	 * 
	 * @Description 检查礼券是否已被使用
	 * @param giftNo
	 * @return
	 * @author QUINN
	 * @date 2014年8月26日下午2:39:33
	 */
	boolean checkGiftNo(String giftNo);

	/**
	 * 
	 * @Description 查询订单的支付退货记录并根据时间排序
	 * @param orderId
	 * @return
	 * @author QUINN
	 * @date 2014年8月27日下午4:29:16
	 */
	List<OrderRecord> findOrderRecord(String orderId) throws Exception;

	/**
	 * 
	 * @Description 用户充值接口
	 * @param memId
	 *            充值会员id
	 * @param amount
	 *            充值金额
	 * @param operator
	 *            操作人关联SEC_USR
	 * @param storeName
	 *            门店拼音简写
	 * @param branId
	 *            门店编号
	 * @return
	 * @author QUINN
	 * @date 2014年8月27日下午7:51:00
	 */
	String recharge(String memId, double amount, String operator, String storeName, String branId) throws Exception;

	/**
	 * 退货
	 * 
	 * @param order
	 *            退货单
	 * @param products
	 *            退货商品
	 * @return 退货单id
	 */
	String refundGoods(PosOrderEntity order, List<PosOrderPrdEntity> products, String storeName) throws Exception;

	/**
	 * 
	 * @Desc 创建退货单
	 * @author QUINN
	 * @date 2014年9月4日下午7:41:51
	 * @param order
	 * @param prds
	 * @return
	 */
	String createRetOrder(PosOrderEntity order, List<PosOrderPrdEntity> prds, String operator, String storeName)
			throws Exception;

	/**
	 * 
	 * @Desc 根据属性条件查询订单列表
	 * @author QUINN
	 * @date 2014年9月5日下午2:35:33
	 * @param order
	 * @return
	 */
	List<PosOrderEntity> findOrderCollectionsByCondition(PosOrderEntity order);

	/**
	 * pad查询订单详情
	 * 
	 * @param order
	 * @return
	 * @date: 2014年11月6日
	 */
	List<PosOrderEntity> findOrderList(PosOrderEntity order);

	/**
	 * 
	 * @Desc 验证礼券编号
	 * @author QUINN
	 * @date 2014年11月18日下午4:33:27
	 * @param no
	 * @return
	 */
	boolean validaGiftno(String no);
	
	/**
	 * 
	 * @Desc 验证礼券编号是否使用过
	 * @author QUINN
	 * @date 2014年12月3日下午3:29:29
	 * @param no
	 * @return
	 */
	boolean isUsedGiftno(String no);
	/**
	 * 获取打印收银明细的信息
	 * @param pkOrderId
	 * @return
	 * @date: 2014年11月24日
	 */
	public void  printOrderDetail(String pkOrderId);
	
	public List<PrinterMessage> getInfo(String pkOrderId);

	

}
